package com.cn.yunhe.rentcars.captcah;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

/**
 * 验证码创建者实体类B。该类是一个未完成的实现。请后续开发者完善。
 *
 * @author 赵志学
 * @date 2016-08-03
 * @version v0.1
 */
public class BCaptcha extends AbstractCaptcha {
	
    public final static String CODEER_NAME = "BCaptcha";
    private char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
        'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
        'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};//用于生产的母字符数组
    private Font font = new Font("Fixedsys", Font.BOLD, 30);//验证码字体

  
	public BCaptcha() {
    }

    @Override
    public String generateCaptchaString() {
    	//定义个 变量 存放获取到的随机字符。
        StringBuilder sb = new StringBuilder();
        	//循环取得字符。codeLength 是在父类中定义的验证码的个数。
        for (int i = 0; i < codeLength; i++) {
        	//random 是在父类中定义的产生一个随机数，种子是：字符数组的长度，
        	/**
        	 * 这样获取到的随机数会在 数组的下标区间之内，随机产生一个数。
        	 */
            sb.append(codeSequence[random.nextInt(codeSequence.length)]);
        }
        //返回上面循环取得的 随机字符，返回字符串。
       
        return sb.toString();
    }

    @Override
    public Image generateCaptchaImage(String code) {
    	/**
    	 * Image是一个抽象列，BufferedImage是Image的实现。
			*Image和BufferedImage的主要作用就是将一副图片加载到内存中。
			*三个参数 宽度，高度。图片的像素。
    	 */
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //图形对象。
        Graphics gd = bi.getGraphics();
        //设定图形颜色。
        gd.setColor(Color.WHITE);
        //设定图形 矩形大小。
        gd.fillRect(0, 0, width, height);
        //设定字体样式
        gd.setFont(font);
        //设置字体颜色
        gd.setColor(Color.BLACK);
        //画一个矩形，
        gd.drawRect(0, 0, width - 1, height - 1);
        //绘制图形，根据指定的字符串。
        drawCodeString(gd, code);
        return bi;
    }

    /**
     * 绘制图形方法。
     * @param gd
     * @param code
     */
    public void drawCodeString(Graphics gd, String code) {
        for (int i = 0; i < codeLength; i++) {
           //随机生成一个颜色，作为图片前景色。
        	gd.setColor(ColorUtil.randomColor());
          //使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本
        	//设定文字在方框中的垂直位置，最后一个参数。
            gd.drawString(String.valueOf(code.charAt(i)), (i + 1) * 15, 30);
        }
    }

}
